因业务需求,笔者需要搭建一个弱网环境,来测试设备在弱网环境下的表现。现在已有一些弱网模拟工具,微软有Network Emulator for Windows Toolkit(NEWT),Facebook有Augmented Traffic Control(ATC),这些方式要么是通过代理,要么就是只能实现wifi丢包,我们需要模拟网口的丢包,因此只能借助于开源的OpenWRT linux系统,调用其tc命令来控制流量,实现丢包、传输延时等。

一. ssh管理极路由

1. 登录路由器,进入管理后台

2. 点击云插件

3. 路由器信息 -> 高级设置 -> 开通开发者模式

4. 注册小极账号,关注微信公众号,关联小极账号

5. 终端输入命令:ssh -p 1022 root@192.168.199.1 使用ssh管理路由,顺利的话此时拥有root权限并可以使用linux命令了

二. 极壹刷入OpenWRT系统

刷入OpenWRT系统有两种方式。第一种就是在本地采用强制刷入的方式,这种方式也可以救砖。需要在windows电脑上安装tftpd,将下载好的bin文件命名为recovery.bin并放到tftpd目录下;极路由尖锐物按住reset,同时通电;直到tftpd提示上传中的小窗口进度条,再松开reset;等待1~3分钟即可。第二种方式就是使用更新的方式,如下。

1. 登录ssh

2. 将U-boot替换成解锁版

1
2
3
cd /tmp
wget http://www.xuanlove.download/hiwifi/HC6361-uboot.bin
mtd write HC6361-uboot.bin u-boot

3. 刷入固件

1
2
wget http://www.xuanlove.download/hiwifi/openwrt-ar71xx-generic-hiwifi-hc6361-squashfs-sysupgrade.bin
sysupgrade -F -n openwrt-ar71xx-generic-hiwifi-hc6361-squashfs-sysupgrade.bin

这里当然也可以不使用wget的方式,可以先把bin文件下载到本地,再通过scp命令拷贝到路由器目录下:

1
scp recovery.bin root@192.168.199.1:/tmp/recovery.bin

4. 稍等1-3分钟,访问192.168.1.1,进入OpenWRT管理后台配置密码、端口号、及SSH公钥

之后ssh -p 22 root@192.168.1.1,之后可能让选择,输入yes回车,进入ssh。如果是失败了,可能已经配置过,打开.ssh/known_hosts将192.168.1.1相关的host配置删除,重新执行命令。

三. 重新编译OpenWRT系统

由于流量控制需要使用tc、netem命令,编译好的OpenWRT一般是默认不包含netem的,此时需要修改编译配置并重新编译OpenWRT系统。OpenWRT的编译不支持大小写不敏感的系统,需要使用linux系统来编译,此处使用了ubuntu。

1. 下载源代码

1
2
git clone https://github.com/rssnsj/openwrt-hc6361.git
cd openwrt-hc6361

2. 安装所需依赖包

1
sudo apt-get install libncurses5-dev zlib1g-dev gawk flex patch git-core g++ subversion

3. 修改部分配置

1
make menuconfig

修改如下配置:

  • CONFIG_PACKAGE_kmod-netem=y
  • CONFIG_PACKAGE_kmod-sched-core=y
  • CONFIG_PACKAGE_kmod-sched=y

然后顺便看一看有没有luci相关的配置,没有的话需要更新下openwrt源码包。

4.更新openwrt包(luci包等)

1
2
./scrips/feeds update -a
./scrips/feeds install -a -p

也可以只更新luci包:

1
2
./scripts/feeds update packages luci
./scripts/feeds install -a -p luci

5. 配置luci

make menuconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
配置内容以下选项和下边的设置一样,其他选项保持默认:
Target System (x86)
Subtarget (Generic)
Target Profile (Generic)
Target Image -->
< > jffs2
< > squashfs
< > tgz
<* > Build VMware image files (VMDK). Requires qemu-img
Network -->
<*> uhttpd
LuCI -->
Collections -->
< * > luci
Applications-->
<* > luci-app-ddns
<* > luci-app-firewall
<* > luci-app-ntpc
<* > luci-app-samba
Themes-->全选
Translations -->
<* > luci-i18n-chinese

6. make V=99 (显示详细信息)命令编译

如果编译过程中出现提示pdnsd-1.2.9a包下载失败之类的提示,可以在menuconfig中取消编译这一项,它是一个软件包,后面想安装也可以直接下载编译好的ipk通过opkg install *.ipk的方式安装。

四. TC常用命令

删除原来的tc规则队列

tc qdisc del dev eth0 root

设置延时

tc qdisc add dev eth0 root netem delay 30ms

显示延时的设置

tc qdisc show

修改延时

tc qdisc change dev eth0 root netem delay 40ms

删除延时的配置

tc qdisc del dev eth0 root netem delay 40ms

五. 配置路由器启动时自动运行流量控制脚本

OPenWRT luci后台 –> 启动项,网页最下面有一个文本框可以写入shell脚本如下:

1
2
tc qdisc add dev eth0 root netem loss 10% delay 100ms 50ms 60%
tc qdisc add dev wlan0 root netem loss 10% delay 100ms 50ms 60%

意思是设置eth0口的丢包率为10%,传输延时为100ms,波动值为100ms± 50ms,60% 的包会延迟± 50ms发送。设备的连接方式如图:

此处应该注意lan口之间通信走的是内部交换机,不会发生丢包现象,因此不能把pos机和打印机同时接到同一个路由器的LAN口上。要想让pos接LAN口怎么办?当然是使用桥接的方式。此处因为要求pos机和打印机的ip地址在同一个网段上,因此不能使用中继的方式,中继要求两个路由器使用不同的ip网段,比如192.168.1.1和192.168.121.1;而桥接模式则是192.168.1.1和192.168.1.2这样的。

六. OPenWRT开启无线桥接

此处开启桥接模式的方式又有两种,一种是需要主路由开启WDS,从路由也需要一些设置。由于极壹没有WPS这些高级设置选项,因此只能通过第二种方式,使用Openwrt上替代WDS的wlan扩网方式stabridge。

1. 安装必要的软件包

1
2
3
opkg update #此步是必要的,不然不一定能找到需要的插件包
opkg install relayd
opkg install luci-proto-relay

2. 网络 -> 无线 -> 搜索,找到主路由加入网络

加入网络选client模式并指定网络为wwan,密码为主路由wifi密码,注意选择 lan,提交。
界面中操作多次失败,接下来在ssh命令行中操作。

3. openwrt ssh编辑以下配置文件

1. vim /etc/config/network做如下修改

1
2
3
4
5
6
7
8
9
# 添加中继桥相关配置
config interface 'stabridge' #添加中继桥
option proto 'relay'
option network 'lan wwan'
# 从路由器lan口ip地址不宜和主路由ip地址冲突
config interface 'lan'
...
option ipaddr '192.168.1.30' #手动指派从路由ip地址v,比如主路由是192.168.1.1,此处可以是192.168.1.2

2. vim /etc/config/dhcp 做如下修改

1
2
3
4
# lan相关配置下添加一行,关掉lan的dhcp
config dhcp lan
...
option ignore 1 #这一行添加,关掉lan的dhcp功能

2. vim /etc/config/firewall 做如下修改

1
2
3
4
5
6
config zone
option name 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT' #修改前为REJECT
option network 'lan wwan' #添加了wwan

4. 保存并重启,此时从路由应该可以上网了

5. 若从路由wifi连接失败,修改配置

后台 -> 网络 -> 无线 -> 添加,新增加一个热点,选择AP模式,注意选择lan,保存。

此时在ssh中使用ifconfig,应该能发现多了一个wlan0_1端口,WiFi限速应该对此端口做。重启从路由器,热点可以连接了。

参考资料